#ifndef __CWIT_LIST_H__
#define __CWIT_LIST_H__

#ifdef __cplusplus
extern "C" {
#endif

//链表节点
typedef struct _CWIT_LIST_NODE{
    void *data;
    struct _CWIT_LIST_NODE *front; //上一个指针
    struct _CWIT_LIST_NODE *next;  //下一个指针
}cwit_list_node;

//链表
typedef struct _CWIT_LIST{
    struct _CWIT_LIST_NODE header; //链表头
    struct _CWIT_LIST_NODE *tail;  //链表尾部
    int size; //链表大小
}cwit_list;

/*
 * 函数功能：函数指针
 * 参数：
 *       front 链表当前节点的前一个节点
 *       data  链表当前节点
 *       next  链表当前节点的下一个节点
 * 返回值：查看调用函数注释
 */
typedef int(*cwit_list_condition_fun)(void *front,void *data,void *next,void *param);

/*
 * 函数功能：链表初始化
 * 参数：
 * 返回值：链表指针
 * 注： 内部malloc创建
 * 注： 非指针链表初始化请使用malloc将整块数据置为0
 */
cwit_list* cwit_list_init();

/*
 * 函数功能：计算链表大小
 * 参数：
 *       list 链表指针
 * 返回值：当前链表的节点个数
 */
int cwit_list_size(cwit_list* list);

/*
 * 函数功能：获取链表指定位置的数据
 * 参数：
 *       list 链表指针
 *       pos  链表节点位置
 * 返回值：pos位置的数据
 */
void* cwit_list_get_ops(cwit_list* list, int pos);

/*
 * 函数功能：获取链表头节点数据
 * 参数：
 *       list 链表指针
 * 返回值：链表的第一个节点数据
 */
void *cwit__list_get_header(cwit_list* list);

/*
 * 函数功能：获取链表尾节点数据
 * 参数：
 *       list 链表指针
 * 返回值：链表的最后一个节点数据
 */
void *cwit_list_get_tail(cwit_list* list);

/*
 * 函数功能：链表指定条件获取数据
 * 参数：
 *       list 链表指针
 *       condition_fun 回调函数，该函数返回1 表示返回当前数据，返回0表示跳过
 *       userparam 用户数据，该数据会作为回调函数的参数传入
 * 返回值：
 */
void *cwit_list_get_condition(cwit_list* list,cwit_list_condition_fun condition_fun,void *userparam);

/*
 * 函数功能：链表指定位置插入数据
 * 参数：
 *       list 链表指针
 *       pos  节点位置
 *       data 需要插入的数据
 * 返回值：
 */
void cwit_list_insert_position(cwit_list *list, int pos, void* data);

/*
 * 函数功能：链表头部插入数据
 * 参数：
 *       list 链表指针
 *       data 需要插入的数据
 * 返回值：
 */
void cwit__list_push_header(cwit_list *list,void* data);

/*
 * 函数功能：链表尾部插入数据
 * 参数：
 *       list 链表指针
 *       data 需要插入的数据
 * 返回值：
 */
void cwit_list_push_tail(cwit_list *list,void* data);

/*
 * 函数功能：指定条件插入数据
 * 参数：
 *       list 链表指针
 *       data 插入的数据
 *       condition_fun 回调函数，该函数返回1 表示插入数据，返回0表示跳过
 *       userparam 用户数据，该数据会作为回调函数的参数传入
 * 返回值：
 */
void cwit_list_insert_condition(cwit_list *list, void *data,cwit_list_condition_fun condition_fun,void *userparam);

/*
 * 函数功能：移除指定位置的数据
 * 参数：
 *       list 链表指针
 *       pos 节点位置
 * 返回值：链表pos位置的数据
 * 注： 链表不会自动free释放数据，该数据回通过返回值返回
 */
void* cwit_list_remove_position(cwit_list *list, int pos);

/*
 * 函数功能：移除链表头数据
 * 参数：
 *       list 链表指针
 * 返回值：链表头的数据
 * 注： 链表不会自动free释放数据，该数据回通过返回值返回
 */
void *cwit_list_remove_header(cwit_list *list);

/*
 * 函数功能：移除链表尾数据
 * 参数：
 *       list 链表指针
 * 返回值：链表尾的数据
 * 注： 链表不会自动free释放数据，该数据回通过返回值返回
 */
void *cwit_list_remove_tail(cwit_list *list);

/*
 * 函数功能：指定条件移除数据
 * 参数：
 *       list 链表指针
 *       condition_fun 回调函数，该函数返回1 表示删除数据，返回0表示跳过
 *       userparam 用户数据，该数据会作为回调函数的参数传入
 * 返回值：
 * 注： 链表不会自动free释放数据
 */
void cwit_list_remove_condition(cwit_list *list, cwit_list_condition_fun condition_fun,void *userparam);

/*
 * 函数功能：指定条件移除数据,并将符合条件数据形成新链表
 * 参数：
 *       list 链表指针
 *       condition_fun 回调函数，该函数返回1 表示删除数据，返回0表示跳过
 *       userparam 用户数据，该数据会作为回调函数的参数传入
 * 返回值：
 * 注： 链表不会自动free释放数据
 */
cwit_list *cwit_list_remove_condition_to_list(cwit_list *list, cwit_list_condition_fun condition_fun,void *userparam);

/*
 * 函数功能：指定条件移除数据
 * 参数：
 *       list 链表指针
 *       data 比较值
 *       datsize 比较值大小
 *       isfree 是否需要free释放内存，1释放，0不释放
 * 返回值：
 * 注： 通过memcmp进行比较数据
 */
void cwit_list_remove_value(cwit_list *list,void *data,int datsize,int isfree);

/*
 * 函数功能：遍历链表
 * 参数：
 *       list 链表指针
 *       traversal_fun 回调函数
 *       userparam 用户数据，该数据会作为回调函数的参数传入
 * 返回值：
 */
void cwit_list_traversal(cwit_list *list, cwit_list_condition_fun traversal_fun,void *userparam);

//排序
// void cwit_list_sort(cwit_list *list, cwit_list_condition_fun traversal_fun);

#ifdef __cplusplus
}
#endif


#endif